#include "fw_interface.h"


void REG_UpperbridgeIOmode(void)
{
#if 1 //temp
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_StructInit(&GPIO_InitStructure);

    RCC_AHBPeriphClockCmd(BLDC_GPIO_CLK, ENABLE);

    GPIO_ResetBits(BLDC_UH_PORT, BLDC_UH_PIN);
    GPIO_ResetBits(BLDC_VH_PORT, BLDC_VH_PIN);
    GPIO_ResetBits(BLDC_WH_PORT, BLDC_WH_PIN);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

    GPIO_InitStructure.GPIO_Pin = BLDC_UH_PIN;
    GPIO_Init(BLDC_UH_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = BLDC_VH_PIN;
    GPIO_Init(BLDC_VH_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = BLDC_WH_PIN;
    GPIO_Init(BLDC_WH_PORT, &GPIO_InitStructure);
#endif

}

void REG_UpperbridgePWMmode(void)
{
#if 1 //temp
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_StructInit(&GPIO_InitStructure);

    RCC_AHBPeriphClockCmd(BLDC_GPIO_CLK, ENABLE);

    GPIO_ResetBits(BLDC_UH_PORT, BLDC_UH_PIN);
    GPIO_ResetBits(BLDC_VH_PORT, BLDC_VH_PIN);
    GPIO_ResetBits(BLDC_WH_PORT, BLDC_WH_PIN);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

    GPIO_InitStructure.GPIO_Pin = BLDC_UH_PIN;
    GPIO_Init(BLDC_UH_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = BLDC_VH_PIN;
    GPIO_Init(BLDC_VH_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = BLDC_WH_PIN;
    GPIO_Init(BLDC_WH_PORT, &GPIO_InitStructure);


    GPIO_PinAFConfig(BLDC_UH_PORT, BLDC_UH_PIN_SRC, BLDC_UH_PIN_AF);
    GPIO_PinAFConfig(BLDC_VH_PORT, BLDC_VH_PIN_SRC, BLDC_VH_PIN_AF);
    GPIO_PinAFConfig(BLDC_WH_PORT, BLDC_WH_PIN_SRC, BLDC_WH_PIN_AF);
#endif

}

void REG_PWM_Output_Ctr(FunctionalState NewState)
{
    TIM_CtrlPWMOutputs(TIM1, NewState);
}

void REG_PWM_Duty_Ctr(STR_SVM_TypeDef *tS_SVM)
{
    SET_CCR1_VAL(tS_SVM->nCmpr1);
    SET_CCR2_VAL(tS_SVM->nCmpr2);
    SET_CCR3_VAL(tS_SVM->nCmpr3);
}

void REG_PWM_Duty_Output(u16 t_unDuty1, u16 t_unDuty2, u16 t_unDuty3)
{
    SET_CCR1_VAL(t_unDuty1);
    SET_CCR2_VAL(t_unDuty2);
    SET_CCR3_VAL(t_unDuty3);
}

void REG_HWDIV_S32Div(STR_DIV_COMP *tS_DIVI)
{
//    RCC->AHBRSTR |= RCC_AHBRSTR_DVSQRST;
//    RCC->AHBRSTR &= ~RCC_AHBRSTR_DVSQRST;

//    DVSQ_Wait();

    DVSQ->DIVIDEND = tS_DIVI->Dividend;
    DVSQ->DIVISOR  = tS_DIVI->Divisor;

    DVSQ_Wait();
    tS_DIVI->Quotient = (int32_t)DVSQ->RES;
//    tS_DIVI->Quotient = tS_DIVI->Dividend / tS_DIVI->Divisor;
}

void REG_PWM_Out_Enable(void)
{
    TIM1->BDTR |= TIM_BDTR_MOE;
}

void REG_PWM_Out_Disable(void)
{
    TIM1->BDTR &= (uint16_t)(~((uint16_t)TIM_BDTR_MOE));
}

//u32 HWSqrt(u32 u32Radicand)
//{
//    DVSQ_Wait();

//    /*Whether to enable high-precision square root mode*/
//    DVSQ_ConfigSqrtPresNormal();

//    DVSQ->RADICAND = u32Radicand;

//    DVSQ_Wait();

//    return DVSQ->RES;
//}

//u16 ADC_Trans_Iu(void)
//{
//    u16 t_unDataBuf;

//    ADC1->CHSELR = (1 << 3); //AIN3
//    ADC1->CR |= 1 << 2;

////    while(ADC1->CR&(1<<2));
//    while ((ADC1->ISR & ADC_FLAG_EOC) == RESET);
//    t_unDataBuf = ADC1->DR & 0x0fff;

//    return t_unDataBuf;
//}

//u16 ADC_Trans_Iv(void)
//{
//    u16 t_unDataBuf;

//    ADC1->CHSELR = (1 << 4); //AIN4
//    ADC1->CR |= 1 << 2;

////    while(ADC1->CR&(1<<2));
//    while ((ADC1->ISR & ADC_FLAG_EOC) == RESET);
//    t_unDataBuf = ADC1->DR & 0x0fff;

//    return t_unDataBuf;
//}

//u16 ADC_Trans_VBus(void)
//{
//    u16 t_unDataBuf;

//    ADC1->CHSELR = (1 << 1); //AIN1
//    ADC1->CR |= 1 << 2;

////    while(ADC1->CR&(1<<2));
//    while ((ADC1->ISR & ADC_FLAG_EOC) == RESET);
//    t_unDataBuf = ADC1->DR & 0x0fff;

//    return t_unDataBuf;
//}

//u16 ADC_Trans_VSP(void)
//{
//    u16 t_unDataBuf;

//    ADC1->CHSELR = (1 << 2); //AIN2
//    ADC1->CR |= 1 << 2;

////    while(ADC1->CR&(1<<2));
//    while ((ADC1->ISR & ADC_FLAG_EOC) == RESET);
//    t_unDataBuf = ADC1->DR & 0x0fff;

//    return t_unDataBuf;
//}

